

////////////////////////////////////////////////////////////////////////////////

//                   DRIVER  PARA MAX7221 - MAX7219                           //

//          DRIVER PARA DISPLAY DE 7 SEGMENTOS 8 DIGITOS CATCOM               //

//                         CON INTERFAZ  SERIAL                               //

//                ANTES DE ENVIAR DATOS AL DISPLAY:                           //

//                #include<MAX7221.h>                                         //

//                display_init()  (inicializa display)                        //                                                           //

//                write_display(digito,dato) ,muestra el dato en digito       //                                                                       //

//                DIGITO: de 0 a 8                                            //

//                FORMATO:                                                    //

//                D15--D12 D11---D8 D7-------DO  (16BITS)                     //

//                X      X  digito  msb DATO lsb                              //

//                                                                            //

//                                                                            //

// PCW  V.3.221  fjr07@yahoo.es ing electrica U.de.A col.       26/2/2005     //

////////////////////////////////////////////////////////////////////////////////

#ifndef L_SCK              // PINES A EMPLEAR

#define L_SC   PIN_B1      // PIN LOAD (habilita escritura de datos)

#define L_SCK  PIN_B2      // PIN DE RELOJ

#define L_DIN  PIN_B3      // PIN SALIDA DE DATOS

#endif



void write_LED_byte(BYTE cmd) {   // rutina que envia serialmente los bytes

   BYTE i;                        // dezplazando este hacia la izquierda bit a bit

   for(i=0;i<=7;++i) {            // por cada dezplazamiento un pulso de reloj



      output_bit(L_DIN, shift_left(&cmd,1,0) ); // envia los datos bit a bit

      output_high(L_SCK);                       //  salida sck en alto

      output_low(L_SCK);                        // luego retorna a estado bajo

   }                                            // (pulso de reloj sck)

}

// ******subrutina que  controla el max 7221 envia dato a mostrar en digito****

void write_led(BYTE cmd, BYTE data) {

   output_low(L_SC);     // habilitamos escritura ( pin load en bajo)

   write_LED_byte(cmd);  // enviamos primer byte (digito y control)

   write_LED_byte(data); // enviamos segundo byte de datos

   output_high(L_SC);    // terminamos escritura (pin load en alto)

}

//****** subrutina que inicializa el max7221   para luego poder enviar*********

                      // datos al display

void display_init()

{

 write_led(0x0b,0x07); // modo scan limit muestre (5 Digitos) num de digitos de 0-7

 write_led(0x0c,0x01); // limpie displays (modo Shutdown)

 write_led(0x09,0xff); // probar displays (modo Display test)

 write_led(0x0a,0x00); // modo (control de intensidad )

                       // intensidad igual a (31/32) de la corriente pico (Iset)

 }                     // (para mas detalles de control ver datasheets)

                       // la corriente de los display se regula con

                       // solo una resistencia externa (Iset)



Y AQUI UN PROGRAMA DE EJEMPLO: 
Codigo:


/////////////////////////////////////////////////////////////////////////

////                                                                 ////

////                                                                 ////

////                                                                 ////

////    manejo de un driver serial  para display MAX7221-7219        ////

////                     con pic16f84                                ////

////                    fjrd07@yahoo.es                              ////

////                                                                 ////

////                                                                 ////

////  PCW C COMPILER  VER 3.221                            26/2/2005 ////

////                                                                 ////

/////////////////////////////////////////////////////////////////////////



#include <16F84A.h>              // DISPOSITIVO A PROGRAMAR

#include <MAX7221.h>             // DRIVER MAX7221

/////////////////declaracion de variables y configuracion///////////////////////

#use delay(clock=4000000)        // XTAL OSCILADOR EXRTERNO 4MHZ

#fuses HS,NOWDT,NOPROTECT        // FUSIBLES DE CONFIGURACION

#byte porta=5                    // DIRECION DE MEMORIA DE PORTB

#byte portb=6                    // DIRECION DE MEMORIA DE PORTB

signed int conta,digit;

set_tris_b(0);               // puertob como salidas

set_tris_a(0);               // puertoa como salidas

/////////////////////////////// PROGRAMA PRINCIPAL//////////////////////////////

void main(void)

  {

   digit=1;                     // inicializo variables

   conta=9;

   display_init();              // inicializo max 7221-7219 (ver archivo .h y

                                // datasheets) otros modos de operacion

   output_high(L_SC);          // hacer el pin SC del max77219 alto

   output_low(L_SCK);          // hacer elpin de reloj clk del max7216 bajo

                                // para esta conf funciona en modo scan limit

//**************ENVIA DATOS AL DISPLAY DE 7segx8dig**************************

  while (true)                  // bucle infinito

  {

    write_LED(digit,conta);     //digito a escribir con el dato en max7219

    delay_ms(1000);              //espera un aprox 1seg

    digit=++digit;

    conta=--conta;               //decremento contador

    if(conta<0) conta=9;        // muestro los digitos del 9 a 0 de der a izqu

    if(digit==9) digit=1;       // en los 8  digitos

    output_high(PIN_A0);        // esto enciende y apaga un led en porta.0

    delay_ms(500);

    output_low(PIN_A0);

    delay_ms(500);



         }                       // vuelve a comenzar el bucle

  }